/*
 * @Author: Suo-Yuheng syh15399227325@163.com
 * @Date: 2025-09-09 11:03:46
 * @LastEditors: Suo-Yuheng syh15399227325@163.com
 * @LastEditTime: 2025-09-09 11:13:13
 * @FilePath: /0907/tcp/Daemon.hpp
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%A
 */
#pragma once

#include <iostream>
#include <cstdlib>
#include <unistd.h>
#include <signal.h>
#include <string>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

using namespace std;

const string nullfile = "/dev/null";

void Daemon(const string &cwd = "")
{
    // 1 忽略其他异常信号
    signal(SIGCHLD, SIG_IGN);
    signal(SIGPIPE, SIG_IGN);
    signal(SIGSTOP, SIG_IGN);

    // 2 将自己编程独立会话
    if(fork() > 0) exit(0);
    setsid();

    // 3 更改自己当前的 工作目录
    if(!cwd.empty()) chdir(cwd.c_str());

    // 4  标准输入标准输出标准错误,,,重定向至  /dev/null  中,或者重定向到 文件
    int fd = open(nullfile.c_str(), O_RDWR);
    if(fd > 0)
    {
        dup2(fd, 0);
        dup2(fd, 1);
        dup2(fd, 2);
        close(fd);
    }
}